<?php
namespace core\models;
/**
 * Token令牌处理
 * 主要用于防止表单重复提交，注意此类依赖session。并且如果session的写入速度慢于数据提交速度的话会有漏网的！
 * 用法：
 * [code]
 * $O = \core\models\Token::Md5();
 * //生成
 * $token_str = $O->setToken(); //此值放到表单隐藏域tokenHide
 * //表单提交时
 * if($O->validToken($_POST['tokenHide'])){
 *      //这里写具体数据提交代码
 * }
 * [/code]
 * @package core\models
 * @author  ZhouHaoHua <53027327@qq.com>
 */
class Token_Md5 {

    private $name;
    /**
     * Token令牌处理
     * @param string $name 令牌变量名称，建议使用表单的名称作为令牌名称
     */
    public function __construct($name = 'phpToken'){
        $this->name = $name;
    }

    /**
     * 设置并返回令牌串
     * @return string
     */
    public function setToken(){
        $string = $_SESSION[$this->name] = md5(mt_rand().microtime(true).mt_rand());
        return $string;
    }

    /**
     * 令牌验证
     * @param $tokenString 待验证的令牌字串
     * @return bool 验证通过返回true，否则返回false
     */
    public function validToken($tokenString){
        $r = ($tokenString === $_SESSION[$this->name] ? true : false);
        $this->setToken();
        return $r;
    }

    /**
     * 取得令牌变量的名称
     * @return string
     */
    public function getName(){
        return $this->name;
    }
}